import { generateObject } from 'ai';
import { createDeepSeek } from '@ai-sdk/deepseek';
import { z } from 'zod';
import { AGENT_TOOLS_DESCRIPTION } from '../manage/agent-chat/agent-tools';

// 定义聊天模式：agent（工具调用）、rag（知识检索）、normal（普通对话）
type ChatMode = 'agent' | 'rag' | 'normal';

// 定义合并后的响应 Schema
const chatModeSchema = z.object({
  mode: z.enum(['agent', 'rag', 'normal']).describe('最终确定的聊天模式'),
  reason: z.string().describe('做出此判断的详细理由'),
});

// 统一的模式判断函数
async function determineChatMode(question: string, hasUploadedDoc: boolean): Promise<{ mode: ChatMode; reason: string }> {

  console.log(`🤔 正在为问题判断模式: "${question.substring(0, 50)}..."`);

  // 3. 调用模型进行判断
  try {
    const deepseek = createDeepSeek({
      apiKey: process.env.AI_GATEWAY_API_KEY,
    });

    const { object } = await generateObject({
      model: deepseek('deepseek-chat'), // 使用 DeepSeek 模型
      schema: chatModeSchema,
      // 提示词
      prompt: `你是一个高级路由助手，负责将用户的问题分发到正确的处理流程。
你的任务是根据问题内容，判断它应该被路由到 'agent'、'rag' 还是 'normal' 模式。

请严格按照以下决策树进行判断：

1.  **首先判断是否需要调用工具 (agent模式)**
    - 你拥有以下工具：${AGENT_TOOLS_DESCRIPTION}
    - 如果用户的问题明显需要使用上述任何一种工具才能回答（例如，查询实时信息、进行复杂计算、操作数据库等），请选择 'agent'。

2.  **如果不需要工具，则判断是否需要进行知识检索 (rag模式)**
    - 如果用户的问题是关于具体的事实、数据、文档内容，或者需要查找特定的知识才能回答，选择 'rag'。
    - **特别提示**：如果用户已经上传了文档 (hasUploadedDoc=true)，那么除非问题明显是闲聊，否则应优先考虑 'rag' 模式。

3.  **如果以上都不是，则使用普通对话模式 (normal模式)**
    - 适用于日常闲聊、情感交流、创意写作、观点询问等不需要任何外部工具或特定知识库的场景。

用户问题：${question}

请以 JSON 格式返回判断结果，包含 mode 和 reason 两个字段。
- mode: 字符串，值为 'agent'、'rag' 或 'normal'。
- reason: 字符串，说明做出该判断的理由。

例如: {"mode": "normal", "reason": "用户的问题是关于闲聊，不需要调用工具或检索知识。"}`,
    });

    console.log(`✅ 模式判断结果: ${object.mode} (理由: ${object.reason})`);

    return object;
  } catch (error) {
    console.error('❌ 模式判断失败，将降级为 normal 模式:', error);
    // 判断失败时，根据是否有上传文档来决定降级策略
    const fallbackMode = hasUploadedDoc ? 'rag' : 'normal';
    return { mode: fallbackMode, reason: `自动降级为 ${fallbackMode} 模式，因为模式判断过程中发生错误。` };
  }
}



// 统一聊天接口：三层智能判断并转发
export async function POST(req: Request) {
  try {
    const { messages, uploadedDocument } = await req.json();

    // 获取最后一条用户消息
    const lastMessage = messages[messages.length - 1];
    const question = lastMessage.parts?.find((p: { type: string; text?: string }) => p.type === 'text')?.text || lastMessage.content;
    if (!question) return new Response(JSON.stringify({ error: '问题内容不能为空' }), { status: 400 });

    console.log(`📨 收到请求，问题: ${question.substring(0, 50)}...`);

    const { mode, reason } = await determineChatMode(question, !!uploadedDocument);

    console.log(`🎯 最终路由模式: ${mode} (路由理由: ${reason})`);

    // 根据判断结果转发到对应的接口
    const response = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'}/api/manage/${mode}-chat`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ messages, uploadedDocument }),
    });

    if (!response.ok) {
      throw new Error(`${mode}-chat 接口返回错误: ${response.status}`);
    }

    // 直接返回子接口的响应（包括流式数据）
    return response;
  } catch (error) {
    console.error('API 转发失败:', error);
    return new Response(JSON.stringify({
      error: '服务器处理失败',
      details: error instanceof Error ? error.message : String(error)
    }), {
      status: 500,
      headers: { 'Content-Type': 'application/json' },
    });
  }
}
